package com.hui.demo.service;

import com.hui.demo.model.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.Collection;
import java.util.List;
import java.util.concurrent.Future;

/**
 * 用户服务层接口
 * @author ziv
 * @date 218-12-07
 */
public interface UserService {

    /**
     * 通过主键查询用户
     * @param userID 用户主键
     * @return User 用户实体
     */
    User findById (String userID);

    /**
     * 查询所有用户列表
     * @return List 用户列表
     */
    List<User> findAll();

    /**
     * 保存用户
     * @param user 用户实体
     * @return user 用户实体
     */
    User save(User user);

    /**
     * 删除用户
     * @param userID 用户主键
     */
    void delete(String userID);

    /**
     * 用户分页
     * @param pageable 分页接口
     * @return page 用户分页
     */
    Page<User> findAll(Pageable pageable);

    /**
     * 通过名字查询用户
     * @param userName 名称
     * @return List 用户列表
     */
    List<User> findByUserName(String userName);

    /**
     * 通过名字模糊查询
     * @param userName 名称
     * @return List 用户列表
     */
    List<User> findByUserNameLike(String userName);

    /**
     * 通过主键ID查询用户
     * @param userIDs 主键ID集合
     * @return List 用户列表
     */
    List<User> findByUserIDIn(Collection<String> userIDs);

    /**
     * 通过用户名密码查询用户
     * @param userName 用户名
     * @param password 密码
     * @return User 用户信息
     */
    User findByNameAndPassword(String userName, String password);

    /**
     * 异步查询所有用户
     * @return
     */
    Future<List<User>> findAsynAll();

    /**
     * 通过用户名密码查询用户,retry机制
     * @param userName 用户名
     * @param password 密码
     * @return User 用户信息
     */
    User findByNameAndPasswordRetry(String userName, String password);
}
